package com.whsxt.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisCacheConfig {
    //使用了 cache 的注解，需要手动设置序列化
    private CacheProperties cacheProperties;

    /**
     * 该配置类被构造时，它里面的参数，将有 Spring 的 ioc 容器提供
     *
     * @param cacheProperties
     */
    public RedisCacheConfig(CacheProperties cacheProperties) {
        this.cacheProperties = cacheProperties;
    }

    /**
     * 定义 Redis 缓存的序列化的形式
     * 在这个 RedisSerializer 类里面提交了 3 种常用的序列化形式
     * 1 java jdk 的序列化 (默认的形式) * 2 json jackson （我们可以手动切换）
     * 3 String String 的序列化(主要用在字符串的存储，不是对象) 对 key 一般使用的是 String
     * 的序列化
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        CacheProperties.Redis redisProperties = this.cacheProperties.getRedis();
        RedisCacheConfiguration config = RedisCacheConfiguration
                .defaultCacheConfig();
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
        // 缓存的过期时间，一般我们在配置文件里面设置
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        // 是否给缓存添加前缀
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        // 空值的缓存
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        //禁用 key
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}